
import javax.swing.JOptionPane;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Figueroa
 */
public class ValidacionMovimientos  {
    
    
    public boolean validate_bishop(int startRow, int startColumn, int desRow, int desColumn, PlayBoard Tablero) {
        
        if (startRow == desRow || startColumn == desColumn) {
            
            strErrorMsg = "Solo se mueven en diagonal";
            return false;
            
        }
        
        //se valida si el movimiento fue en forma diagonal
        return axisMove(startRow, startColumn, desRow, desColumn, Tablero, false);
        
    }
    
    public boolean validate_queen(int startRow, int startColumn, int desRow, int desColumn, PlayBoard tablero) {
        
        boolean axis = true;
        
        if (startRow == desRow ^ startColumn == desColumn) {
            axis = true;
        } else if (startRow != desRow && startColumn != desColumn) {
            axis = false; //MOver diagonal
        } else {
            
            strErrorMsg = "Reina se puede mover en cualquier direccion";
            return false;
            
        }
        
        return axisMove(startRow, startColumn, desRow, desColumn, tablero, axis);
        
    }
    
    public boolean validate_king(int startRow, int startColumn, int desRow, int desColumn) {
        
       
        
        if (desRow == (startRow + 1) && desColumn == startColumn) //S
        {
            return true;
        } else if (desRow == (startRow + 1) && desColumn == (startColumn - 1)) //SW
        {
            return true;
        } else if (desRow == startRow && desColumn == startColumn - 1) //W
        {
            return true;
        } else if (desRow == (startRow - 1) && desColumn == (startColumn - 1)) //NW
        {
            return true;
        } else if (desRow == (startRow - 1) && desColumn == startColumn) //N
        {
            return true;
        } else if (desRow == (startRow - 1) && desColumn == (startColumn + 1)) //NE
        {
            return true;
        } else if (desRow == startRow && desColumn == (startColumn + 1)) //E
        {
            return true;
        } else if (desRow == (startRow + 1) && desColumn == (startColumn + 1)) //SE
        {
            return true;
        } else {
            
           // strErrorMsg = "Rey solo se puede mover un espacio en diferente direcciones";
            return false;
            
        }
        
    }
    
    public boolean validate_knight(int startRow, int startColumn, int desRow, int desColumn) {
        
       
      
        if (desRow == (startRow - 2) && desColumn == (startColumn - 1)) //2N, 1E
        {
            return true;
        } else if (desRow == (startRow - 2) && desColumn == (startColumn + 1)) //2N, 1W
        {
            return true;
        } else if (desRow == (startRow + 2) && desColumn == (startColumn - 1)) //2S, 1E
        {
            return true;
        } else if (desRow == (startRow + 2) && desColumn == (startColumn + 1)) //2S, 1W
        {
            return true;
        } else if (desRow == (startRow - 1) && desColumn == (startColumn - 2)) //1N, 2E
        {
            return true;
        } else if (desRow == (startRow - 1) && desColumn == (startColumn + 2)) //1N, 2W
        {
            return true;
        } else if (desRow == (startRow + 1) && desColumn == (startColumn - 2)) //1S, 2E
        {
            return true;
        } else if (desRow == (startRow + 1) && desColumn == (startColumn + 2)) //1S, 2W
        {
            return true;
        }
        
        return false;
        
    }
    
    public boolean validate_pawn(int startRow, int startColumn, int desRow, int desColumn, PlayBoard tablero, int currentPlayer) {
        
        boolean legalMove = true;
        int[] playerPawnStart = {6,1};
        int[] promotionStart = {0,7};
        
        if ((currentPlayer == 1 && desRow >= startRow) || (currentPlayer == 2 && desRow <= startRow)) //Si se mueven en direccion incorrcta
        {
            
            strErrorMsg = "No se puede mover de esa manera 1";
            legalMove = false;
            
        } else if (desColumn != startColumn) {
            
            if ((desColumn > startColumn && desColumn == (startColumn + 1)) || (desColumn < startColumn && desColumn == (startColumn - 1))) {
                
                if ((desRow == (startRow + 1) && currentPlayer == 2) || (desRow == (startRow - 1) && currentPlayer == 1)) {
                    
                    if (tablero.piece[desRow*8+desColumn] == ' ') 
                    {
                        
                        strErrorMsg = "Solo se puede mover en diagonal cuando van a cojer una pieza enemiga 2";
                        legalMove = false;
                        
                    }
                    
                } else {
                    
                    strErrorMsg = "No se puede mover de esa manera 3";
                    legalMove = false;
                    
                }
                
            } else {
                
                strErrorMsg =  "No se puede mover de esa manera 4";
                legalMove = false;
                
            }
            
        } else if ((currentPlayer == 1 && desRow < (startRow - 1)) || (currentPlayer == 2 && desRow > (startRow + 1))) //If moved two or more places
        {
            
            if ((currentPlayer == 1 && desRow == (startRow - 2)) || (currentPlayer == 2 && desRow == (startRow + 2))) //If moved two places
            {
                
                if (playerPawnStart[currentPlayer - 1] != startRow) 
                {
                    
                    strErrorMsg =  "No se puede mover de esa manera 5";
                    legalMove = false;
                    
                }
                if (tablero.piece[desRow*8+desColumn] != ' '){
            
                strErrorMsg =  "No se puede mover de esa manera 6";
                legalMove = false;
               }
                
            } else {
                strErrorMsg =  "No se puede mover de esa manera 6";
                legalMove = false;
                
                
            }
         // JOptionPane.showMessageDialog(null,strErrorMsg);
        }
       
        else if (tablero.piece[desRow*8+desColumn] != ' '){
            
            strErrorMsg =  "No se puede mover de esa manera 6";
                legalMove = false;
        }
        else if(promotionStart[currentPlayer - 1] == desRow){
            // Con JCombobox
            Object seleccion = JOptionPane.showInputDialog(null,"Seleccione opcion","Promoción del Peón:",JOptionPane.QUESTION_MESSAGE,null,     new Object[] { "Dama", "Caballo", "Torre","Alfil" }, 
                            "Dama");

            if(seleccion == null){
            seleccion = "Dama";
            }
           //System.out.println("El usuario ha elegido "+seleccion);
            tablero.promotion= true;
            boolean Resp = !tablero.setpawnPromotion((String)seleccion,currentPlayer,startRow, startColumn, desRow, desColumn);
            //tablero.promotion = false;
            // System.out.println(Resp);
        
        }
                
         System.out.println(tablero.piece[desRow*8+desColumn]);
        
        if (legalMove) {
            
            finalDesRow = desRow;
            finalDesColumn = desColumn;
            
        }
        
        return legalMove;
        
    }
    
    public boolean validate_rook(int startRow, int startColumn, int desRow, int desColumn, PlayBoard Tablero) {
        
        if (startRow != desRow && startColumn != desColumn) //Si se mueve en diagonal
        {
            
            strErrorMsg = "Torre solo se puede mover en horizontal o vertical";
            return false;
            
        }
       //La reina comparte el mismo movimiento como  un alfil o una torre, para eso se valida el movimiento como 
        //si fuera de los tres
        //Al final el resultado es si la pieza se mueve en forma diagonal o en forma recta
        return axisMove(startRow, startColumn, desRow, desColumn,Tablero, true);
        
    }
    
    
        
    //Verifica si la celda esta vacia
    private boolean checkAxisMove(int newRow, int newColumn, PlayBoard tablero) {
        
        if (tablero.piece[newRow*8+newColumn] != ' ') {//Si no esta vacia
            
            strErrorMsg = "La pieeza esta bloqueando el camino";
            return false;
            
        }
        
        return true;
        
    }
    
    protected boolean axisMove(int startRow, int startColumn, int desRow, int desColumn, PlayBoard tablero, boolean straightAxis) {
        
        if (straightAxis) {//Si se mueve en forma recta (torre , reina)
            
            if ((startColumn == desColumn) && (startRow != desRow)) {
                
                if (desRow < startRow) {//Moverse norte
                    
                    for (int newRow = (startRow - 1); newRow > desRow; newRow--) {
                        
                        if (!checkAxisMove(newRow, desColumn, tablero)) {
                            return false;
                        }
                        
                    }
                    
                } else {
                    
                    for (int newRow = (startRow + 1); newRow < desRow; newRow++) {
                        
                        if (!checkAxisMove(newRow, desColumn, tablero)) {
                            return false;
                        }
                        
                    }
                    
                }
                
            } else if ((startRow == desRow) && (startColumn != desColumn)) {
                
                if (desColumn < startColumn) {
                    
                    for (int newColumn = (startColumn - 1); newColumn > desColumn; newColumn--) {
                        
                        if (!checkAxisMove(desRow, newColumn, tablero)) {
                            return false;
                        }
                        
                    }
                    
                } else {
                    
                    for (int newColumn = (startColumn + 1); newColumn < desColumn; newColumn++) {
                        
                        if (!checkAxisMove(desRow, newColumn, tablero)) {
                            return false;
                        }
                        
                    }
                    
                }
                
            } else {
                
                strErrorMsg = " //Error";
                return false;
                
            }
            
        } else //Moverse en diagonal (alfil, reina)
        {
            
            strErrorMsg = "El destino es esta la misma diagonal";
            int newColumn = 0;
            
            if (desRow < startRow && desColumn < startColumn) {
                
                if ((desRow - startRow) == (desColumn - startColumn)) {
                    
                    for (int newRow = (startRow - 1); newRow > desRow; newRow--) {
                        
                        newColumn = startColumn - (startRow - newRow);
                        
                        if (!checkAxisMove(newRow, newColumn, tablero)) {
                            return false;
                        }
                        
                    }
                    
                } else {
                    return false;
                }
                
            } else if (desRow < startRow && desColumn > startColumn) //si se mueve NE
            {
                
                if ((desRow - startRow) == (startColumn - desColumn)) {
                    
                    for (int newRow = (startRow - 1); newRow > desRow; newRow--) {
                        
                        newColumn = startColumn + (startRow - newRow);
                        
                        if (!checkAxisMove(newRow, newColumn, tablero)) {
                            return false;
                        }
                        
                    }
                    
                } else {
                    return false;
                }
                
            } else if (desRow > startRow && desColumn < startColumn) //si se mueve SW
            {
                
                if ((startRow - desRow) == (desColumn - startColumn)) {
                    
                    for (int newRow = (startRow + 1); newRow < desRow; newRow++) {
                        
                        newColumn = startColumn - (newRow - startRow);
                        
                        if (!checkAxisMove(newRow, newColumn, tablero)) {
                            return false;
                        }
                        
                    }
                    
                } else {
                    return false;
                }
                
            } else if (desRow > startRow && desColumn > startColumn) //si se mueve SE
            {
                
                if ((startRow - desRow) == (startColumn - desColumn)) {
                    
                    for (int newRow = (startRow + 1); newRow < desRow; newRow++) {
                        
                        newColumn = startColumn + (newRow - startRow);
                        
                        if (!checkAxisMove(newRow, newColumn, tablero)) {
                            return false;
                        }
                        
                    }
                    
                } else {
                    return false;
                }
                
            } else //No se mueve en diagoanl
            {
                
                strErrorMsg = "Nunca vi este error :S";
                return false;
                
            }
            
        }
        
        finalDesRow = desRow;
        finalDesColumn = desColumn;
        
        return true;
        
        
    }
    
    String strErrorMsg;
        int finalDesRow;
        int finalDesColumn;
    
}
